package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/base64"
	"fmt"
	"io"
	"io/ioutil"

	"gopkg.in/yaml.v2"
)

// Config 配置结构体
type Config struct {
	MySQL MySQLConfig `yaml:"mysql"`
}

// MySQLConfig MySQL配置
type MySQLConfig struct {
	Username string `yaml:"username"`
	Password string `yaml:"password"`
	DBName   string `yaml:"dbname"`
}

// loadConfig 加载配置文件
func loadConfig(filename string) (*Config, error) {
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	var config Config
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %v", err)
	}

	// 如果配置中没有指定数据库名，则使用默认值
	if config.MySQL.DBName == "" {
		config.MySQL.DBName = "rds_meta"
	}

	// 解密密码
	if config.MySQL.Password != "" {
		decryptedPassword, err := decryptPassword(config.MySQL.Password)
		if err == nil {
			// 解密成功，使用解密后的密码
			config.MySQL.Password = decryptedPassword
		}
		// 如果解密失败，假设密码未加密
	}

	return &config, nil
}

// saveConfig 保存配置文件
func saveConfig(filename string, config *Config) error {
	// 加密密码
	if config.MySQL.Password != "" {
		encryptedPassword, err := encryptPassword(config.MySQL.Password)
		if err == nil {
			config.MySQL.Password = encryptedPassword
		}
	}

	data, err := yaml.Marshal(config)
	if err != nil {
		return fmt.Errorf("序列化配置失败: %v", err)
	}

	err = ioutil.WriteFile(filename, data, 0644)
	if err != nil {
		return fmt.Errorf("写入配置文件失败: %v", err)
	}

	return nil
}

// encryptPassword 加密密码
func encryptPassword(password string) (string, error) {
	// 在实际应用中，应该使用更安全的方法存储密钥
	// 这里仅作示例
	key := []byte("examplekey123456") // 16字节密钥
	plaintext := []byte(password)

	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}

	ciphertext := make([]byte, aes.BlockSize+len(plaintext))
	iv := ciphertext[:aes.BlockSize]
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return "", err
	}

	stream := cipher.NewCFBEncrypter(block, iv)
	stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)

	return base64.URLEncoding.EncodeToString(ciphertext), nil
}

// decryptPassword 解密密码
func decryptPassword(encryptedPassword string) (string, error) {
	// 在实际应用中，应该使用更安全的方法存储密钥
	// 这里仅作示例
	key := []byte("examplekey123456") // 16字节密钥

	ciphertext, err := base64.URLEncoding.DecodeString(encryptedPassword)
	if err != nil {
		return "", err
	}

	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}

	if len(ciphertext) < aes.BlockSize {
		return "", fmt.Errorf("密文块大小不正确")
	}

	iv := ciphertext[:aes.BlockSize]
	ciphertext = ciphertext[aes.BlockSize:]

	stream := cipher.NewCFBDecrypter(block, iv)
	stream.XORKeyStream(ciphertext, ciphertext)

	return string(ciphertext), nil
}